LLM (Large Language Models)
Large Language Models (LLMs) como o ChatGPT 3.5 Turbo são modelos avançados de processamento de linguagem natural desenvolvidos pela OpenAI. Esses modelos são treinados em vastos conjuntos de dados e são capazes de realizar uma variedade de tarefas de linguagem, desde responder perguntas até criar conteúdo original. O ChatGPT 3.5 Turbo é uma versão aprimorada que oferece respostas mais rápidas e precisas.
Uso do ChatGPT 3.5 Turbo no WhatsApp Chatbot
Para o projeto, foi realizado a integração do ChatGPT 3.5 Turbo em uma aplicação, destacando sua utilização para processar e responder a perguntas em tempo real. Abaixo, detalhamos os principais componentes e seu funcionamento:
Arquitetura de Interação
Abaixo, temos um diagrama que representa a arquitetura de interação do ChatGPT 3.5 Turbo. O ChatGPT 3.5 Turbo é utilizado para processar perguntas e gerar respostas. As respostas são então processadas para extrair informações úteis. Por fim, as informações extraídas são utilizadas para realizar ações, como enviar os pontos de navegação.
Nesse sentido, o fluxo de interação do usuário inicia com uma mensagem qualquer ao LLM no Whatsapp, que oferecerá uma série de opções de ações. Se a opção escolhida for "solicitar nova peça", conforme o item na extrema direita da figura, o fluxo seguirá segundo as setas acima.
Para visualizar o código completo, acesse o link clicando aqui
Variáveis de Ambiente
As variáveis de ambiente são utilizadas para armazenar informações sensíveis, como chaves de acesso a APIs. No projeto, utilizamos as seguintes variáveis de ambiente:
Variáveis de API e Modelo ChatGPT
OPENAI_API_KEY
- Descrição: Chave de API para autenticação com os serviços da OpenAI.
- Valor de Exemplo:
"sk-DmNDktshq4blsMSFWPssjBlbkFJoMPFyIhZiExg97assewa"
- Uso: Essencial para realizar chamadas autenticadas aos serviços da OpenAI, como a geração de texto e transcrição de voz.
OPENAI_GPT_MODEL
- Descrição: Especifica o modelo GPT da OpenAI a ser utilizado.
- Valor de Exemplo:
"gpt-4"
- Uso: Define qual versão do modelo de linguagem (por exemplo, GPT-3, GPT-4) será usada para processamento de linguagem natural.
Funcionalidades de Speech-to-Text e Text-to-Speech (TTS)
TRANSCRIPTION_ENABLED
- Descrição: Habilita ou desabilita a funcionalidade de transcrição de voz.
- Valor de Exemplo:
true
- Uso: Quando
true
, o sistema irá reconhecer e transcrever mensagens de voz.
TRANSCRIPTION_LANGUAGE
- Descrição: Define o idioma para transcrição de voz.
- Valor de Exemplo:
"pt-BR"
- Uso: Informa ao serviço de transcrição qual idioma está sendo falado, possibilitando uma transcrição mais precisa. Dependendo do serviço, pode haver detecção automática de idioma se não especificado.
TRANSCRIPTION_URL
- Descrição: URL do serviço de transcrição de voz da OpenAI.
- Valor de Exemplo:
"https://api.openai.com/v1/audio/transcriptions"
- Uso: Endereço para onde as solicitações de transcrição de voz são enviadas.
TTS_URL
- Descrição: URL do serviço de Text-to-Speech (TTS) da OpenAI.
- Valor de Exemplo:
"https://api.openai.com/v1/audio/speech"
- Uso: Endereço para onde as solicitações de conversão de texto em fala são enviadas.
TTS_ENABLED
- Descrição: Habilita ou desabilita a funcionalidade de Text-to-Speech.
- Valor de Exemplo:
true
- Uso: Quando
true
, o sistema pode converter texto em fala.
Conexão de Rede e Banco de Dados
SOCKET_URL
- Descrição: URL do servidor de sockets para comunicação em tempo real.
- Valores de Exemplo:
"http://10.128.68.115:3000"
- Uso: Endereços utilizados para estabelecer conexões de socket para comunicação em tempo real entre diferentes partes do sistema.
DATABASE_URL
- Descrição: URL de conexão com o banco de dados PostgreSQL.
- Valor de Exemplo:
"postgresql://user:password@host:5432/postgres"
- Uso: Utilizada para conectar o sistema ao banco de dados PostgreSQL, contendo informações de autenticação e localização do banco.
Autenticação e Segurança
AUTH_TOKEN
- Descrição: Token utilizado para autenticação de serviços internos.
- Valor de Exemplo:
"Chatbot"
- Uso: Usado para garantir que as solicitações entre diferentes serviços do sistema sejam autenticadas e autorizadas.
TOKEN_SECRET
- Descrição: Segredo utilizado para a geração de tokens de autenticação.
- Valor de Exemplo:
"Chatbot"
- Uso: Utilizado na criação e validação de tokens, garantindo a segurança na comunicação entre serviços.
Um arquivo .env
é utilizado para armazenar essas variáveis de ambiente. O arquivo .env
é ignorado pelo Git, para evitar que as informações sensíveis sejam compartilhadas. Antes de executar o projeto, é necessário criar um arquivo .env
na raiz do projeto chatbot/src
e definir as variáveis citadas acima.
Exemplo de Arquivo .env
Abaixo, temos um exemplo de arquivo .env
utilizado para configurar o projeto.
OPENAI_API_KEY="sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
OPENAI_GPT_MODEL= "gpt-4"
TRANSCRIPTION_ENABLED=true
PROMPT_OPENAI_POINTS="Responda a pergunta abaixo com base no contexto para encontrar as coordenadas do lugar. Fique atento para possíveis variações no nome quando o usuário perguntar.Sempre responda na língua que o usuário se comunicar. Sempre dê as coordenadas no formato ([x], [y], [z])"
PROMPT_OPENAI_TOOLS="Responda a pergunta abaixo no contexto ao qual você se encontra para encontrar apenas a ferramenta ideal que o usuário está procurando. Fique atento para possíveis variações no nome quando o usuário perguntar. Sempre dê o nome da ferramenta no formato ([nome], [id]) e me diga como posso usar."
TRANSCRIPTION_LANGUAGE="pt-BR"
TRANSCRIPTION_URL="https://api.openai.com/v1/audio/transcriptions"
TTS_URL="https://api.openai.com/v1/audio/speech"
TTS_ENABLED=true
SOCKET_URL="http://10.128.68.115:3000"
AUTH_TOKEN="Chatbot"
TOKEN_SECRET="Chatbot"
DATABASE_URL="postgresql://user:password@host:5432/postgres"
Inicialização da API do OpenAI
export function initOpenAI() {
openai = new OpenAIApi(
new Configuration({
apiKey: getConfig("gpt", "apiKey")
})
);
}
- OpenAIApi: Inicializa as configurações necessárias para interagir com o modelo GPT-3.5 Turbo.
- Configurações: Define parâmetros como
temperature
,top_p
, emax_tokens
, que influenciam o estilo e a extensão das respostas geradas pelo modelo. - ApiKey: Chave de acesso para a API do OpenAI.
Leitura de Pontos
No contexto do projeto a ideia inicial era que um arquivo .txt
com os pontos fosse lido e a partir disso fosse feita a extração das coordenadas. Porém, o grupo percebeu que seria mais interessante que o usuário pudesse enviar uma mensagem dizendo onde está a partir de uma lista que o usuário do tipo admin
conseguisse cadastrar, evitando manutenções desnecessárias no código e a partir disso fosse feita a extração das coordenadas.
- Teste de Extração de Pontos
Neste cenário, o usuário está prestes a solicitar um novo item. O chatbot, então, questionará qual é a localização atual do usuário. Em resposta, o usuário indicará o nome do local, escolhendo entre as opções previamente cadastradas no banco de dados. O chatbot, por sua vez, fornecerá as coordenadas geográficas exatas desse local. Estas coordenadas serão extraídas e transmitidas para o servidor através de uma conexão socket. Assim, será possível para o robô navegar até o ponto especificado.
Processamento da Extração de Pontos
Uma vez inicializada a API, o ChatGPT pode ser utilizado para processar perguntas e gerar respostas. O código abaixo demonstra o processo de processamento de perguntas e geração de respostas utilizado para encontrar as coordenadas de um ponto.
export async function getPointOpenAI(message: Message, points) {
let prompt = "Responda a pergunta abaixo com base no contexto para encontrar as coordenadas do lugar. Fique atento para possíveis variações no nome quando o usuário perguntar.Sempre responda na língua que o usuário se comunicar. Sempre dê as coordenadas no formato ([x], [y], [z])"
let jsonPoints = JSON.stringify(points)
let question = `Lista de pontos: ${jsonPoints}. Pergunta: Identifique a responsta do usuário com base na lista de pontos Resposta: ${message.body} e depois coloque as coordenadas do ponto em formato de float.`
const response = await openai.createChatCompletion({
model: 'gpt-4',
messages: [{role: 'system', content: prompt}, { role: 'user', content: question } ],
});
return response.data.choices[0].message?.content;
}
- Geração do Prompt: Constrói um prompt baseado na mensagem recebida e na lista de pontos, instruindo o modelo sobre como responder. O prompt é uma string que contém o contexto e a pergunta, e é utilizado para gerar a resposta, no exemplo acima, utilizamos a role
system
para o contexto euser
para a pergunta. - Interpretação de Resposta: Envia o prompt para o ChatGPT 3.5 Turbo e recebe a resposta, que é processada para extrair informações úteis.
Extração de Informações da Resposta
Para a extração de informações da resposta, utilizamos uma expressão regular para extrair as coordenadas do formato ([x], [y], [z]) da resposta. O código abaixo demonstra o processo de extração de informações utilizado para encontrar as coordenadas de um ponto.
let pointResponse = response.data.choices[0].message?.content;
const regex: RegExp = /-?\d+(?:\.\d+)?,\s*-?\d+(?:\.\d+)?,\s*-?\d+(?:\.\d+)?/gi;
const match = pointResponse?.match(regex);
const socket = io("http://10.128.64.39:3000");
if (match) {
match.forEach(coordinateString => {
// Splitting the matched string into individual numbers
const parts = coordinateString.split(',').map(part => parseFloat(part.trim()));
const [x, y, z] = parts;
socket.emit("send_points", {x, y, z});
message.reply(pointResponse as any);
});
}
else{
message.reply("Não consegui encontrar o ponto. Tente novamente.")
}
- Extração de Coordenadas: Utiliza uma expressão regular para extrair coordenadas do formato ([x], [y], [z]) da resposta.
- Comunicação com Socket: Envia as coordenadas extraídas para um servidor via socket, indicando uma aplicação em tempo real.
- Feedback ao Usuário: Responde ao usuário com a informação extraída ou uma mensagem de erro caso as coordenadas não sejam encontradas.
Considerações de Implementação do ChatGPT 3.5 Turbo
- Precisão do Modelo: Garantir que o modelo esteja bem treinado e capaz de interpretar e responder a uma ampla variedade de consultas com precisão.
- Segurança e Privacidade: Tomar medidas para proteger dados sensíveis que possam ser processados pelo modelo.
- Gerenciamento de Erros: Implementar um robusto sistema de tratamento de erros para lidar com respostas inesperadas ou erros de processamento.
Conclusão
O ChatGPT 3.5 Turbo representa um avanço significativo na área de LLMs, oferecendo respostas rápidas e precisas para uma variedade de tarefas de processamento de linguagem natural. A integração dessa tecnologia em aplicações, como demonstrado no código fornecido, pode melhorar significativamente a interação usuário-máquina e a eficiência do processamento de dados. É fundamental, no entanto, garantir a precisão, segurança e privacidade ao trabalhar com esses modelos avançados.